using System.Diagnostics;

namespace ConsoleApp15
{
    //使用这样的模式制作父类，就能实现完全不用NEW，也能通过单例模式随用随取的访问了，而且支持泛型。
    //这里用泛型以后，就可以执行new T();这样的new无参构造操作
    //也就是说，无论子类是什么，只要继承父类，就一定能被初始化，逻辑一定可以被执行
    public class 面板主容器<T> where T :class,new()
    {
        private static T? _当前面板;
        public static T? 当前面板 { 
            get {
                if (_当前面板 == null) { _当前面板 = new T(); }
                return _当前面板; 
            } 
            set { _当前面板 = value; } }
        public void 操作() => Console.WriteLine($"{当前面板.GetType()} 执行了执行操作");
        public void 显示() => Console.WriteLine($"{当前面板.GetType()} 执行了显示操作");
        public void 隐藏() => Console.WriteLine($"{当前面板.GetType()} 执行了隐藏操作");

        public 面板主容器()
        {
            //此处和Get里的都可以保留，这样即可以new子面板，也可以
            //不new子面版，两种方式都能正常使用
            当前面板 = this as T; 
            if (当前面板 == null) { 当前面板 = new T(); }
        }
    }

    public class 音乐播放面板 : 面板主容器<音乐播放面板>
    {
        public void 播放() => Console.WriteLine("执行了播放操作");
        public void 暂停() => Console.WriteLine("执行了暂停操作");
        public void 停止() => Console.WriteLine("执行了停止操作");
    }
    public class 社交面板 : 面板主容器<社交面板>
    {
        public void 加好友() => Console.WriteLine("执行了加好友操作");
        public void 删好友() => Console.WriteLine("执行了删好友操作");
        public void 发消息() => Console.WriteLine("执行了发消息操作");
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            音乐播放面板 a = new();
            社交面板 b = new();
            音乐播放面板.当前面板.显示();
            音乐播放面板.当前面板.播放();
            音乐播放面板.当前面板.隐藏();
            社交面板.当前面板.显示();
            社交面板.当前面板.加好友();
        }
    }
}